// 前端常用验证数据表达式方法
module.exports = {
    /**
     * 检查日期获取日期+时间或时间格式
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isDate: function(s) {
        var   reg=  /^\d{4}-\d{2}-\d{2}$|^\d{4}-\d{2}-\d{2} \d{1,2}:\d{1,2}:\d{1,2}$|\d{1,2}:\d{1,2}:\d{1,2}$/;
        return reg.exec(s);
    },

    /**
     * 匹配email
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isEmail: function(s) {
        var   reg=  /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;
        return reg.exec(s);
    },

    /**
     * 匹配数字（整数）
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isDigital: function(s) {
        var reg = /^\d+$/;
        return reg.exec(s);
    },

    /**
     * 匹配数字（整数或小数）
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isNum: function(s) {
        var reg = /^\d+$|^\d+\.\d+$/;
        return reg.exec(s);
    },

    /**
     * 匹配非负整数（正整数+0）
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isInt: function(s) {
        var reg = /^[0-9]\d*$/;
        return reg.exec(s);
    },

    /**
     * 匹配小数
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isFloat: function(s) {
        var reg = /^(\d+)(\.(\d{1,2}))$/;
        return reg.exec(s);
    },

    /**
     * 匹配金额
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isMoney: function(s) {
        var reg = /^(([1-9]\d*(,\d{3})*)|([0-9]\d*))(\.(\d{1,2}))?$/;
        return reg.exec(s);
    },

    /**
     * 从字符串的两端删除空白字符和其他预定义字符
     * @param s
     * @returns {*}
     */
    trim: function(s) {
        return s.replace(/(^\s*)|(\s*$)/g, "");
    },

    /**
     * 匹配手机号码
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isMobile: function(s) {
        var reg = /(^13\d{9}$)|(^14)[5,7]\d{8}$|(^15[0,1,2,3,5,6,7,8,9]\d{8}$)|(^19[8,9]\d{8}$)|(^166\d{8}$)|(^17)[0,1,2,3,5,6,7,8,9]\d{8}$|(^18\d{9}$)|(^19\d{9}$)|(^16\d{9}$)/g;
        return reg.exec(s);
    },

    /**
     * 匹配电话号码
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isPhone: function(s) {
        var reg = /^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})+(-[0-9]{1,6})?$/;
        return reg.exec(s);
    },

    /**
     * 匹配汉字
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isChinese: function( s ) {
        var reg = /^[\u4e00-\u9fa5]+$/;
        return reg.exec(s) ;
    },

    /**
     * 匹配身份证号
     * @param s
     * @returns {Array|{index: number, input: string}}
     */
    isIdentity: function( s ) {
        var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
        return reg.exec(s);
    },


    /**
     * 检查变量是否定义
     * @param variable
     * @returns {boolean}
     */
    isDefined: function( variable ) {
        if (typeof(variable) == 'undefined'){
            return false;
        } else {
            return true;
        }
    },

    /**
     * 匹配密码
     */
    isPwd: function( s ) {
        var reg = /^[A-Za-z0-9_-]{6,30}$/;
        return reg.exec(s) ;
    },

    /**
     * 比较日期先后
     * @param sDate     开始日期
     * @param eDate       结束日期
     * @returns {boolean}
     */
    dateCompare : function(sDate, eDate){
        var s = sDate.replace(/-/g,"/");
        var e = eDate.replace(/-/g,"/");
        if (Date.parse(s) - Date.parse(e) > 0){
            return false;
        }
        return true;
    },

    /**
     * 编码 URL 字符串
     * @param str
     * @returns {string}
     */
    urlencode: function( str ) {
        str = str.replace(/\r\n/g,"\n");
        var utftext = "";
        for (var n = 0; n < str.length; n++) {
            var c = str.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    },

    /**
     * 解码已编码的 URL 字符串
     * @param utftext
     * @returns {string}
     */
    urldecode: function(utftext) {
        var str = "";
        var i = 0;
        var c = c1 = c2 = 0;
        while ( i < utftext.length ) {
            c = utftext.charCodeAt(i);
            if (c < 128) {
                str += String.fromCharCode(c);
                i++;
            } else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                str += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            } else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                str += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }
        }
        return str;
    },

    /**
     * 检查参数长度
     * @param val
     * @returns {number}
     */
    len: function( val ) {
        var l = 0;
        var a = val.split("");
        for (var i=0;i<a.length;i++) {
            if (a[i].charCodeAt(0)<299) {
                l++;
            } else {
                l+=2;
            }
        }
        return l;
    },

    /**
     * 检查字符串
     * @param str
     * @param startp
     * @param endp
     * @returns {*}
     */
    sb_substr: function(str, startp, endp) {
        var i= 0, c = 0, unicode = 0, rstr = '';
        var len = str.length;
        var sblen = this.len(str);
        if (startp < 0) {
            startp = sblen + startp;
        }
        if (endp < 1) {
            endp = sblen + endp;// - ((str.charCodeAt(len-1) < 127) ? 1 : 2);
        }
        for(i = 0; i < len; i++) {
            if (c >= startp) {
                break;
            }
            var unicode = str.charCodeAt(i);
            if (unicode < 127) {
                c += 1;
            } else {
                c += 2;
            }
        }
        for(i = i; i < len; i++) {
            var unicode = str.charCodeAt(i);
            if (unicode < 127) {
                c += 1;
            } else {
                c += 2;
            }
            rstr += str.charAt(i);

            if (c >= endp) {
                break;
            }
        }
        return rstr;
    },



    /**
     *
     * @param url
     * @param againstParams  排斥参数   字符串型（ 例如：'uid,pcustID' ）
     * @param addParams      追加参数   对象（ 例如：{'id':123,'name':'try'} ）
     * @returns {string}
     */
    replaceUrlParams: function( url, againstParams , addParams ) {

        var url_obj = this.parseURL( url );

        var new_url = url_obj.protocol + '://' + url_obj.host;
        if (url_obj.path) {
            new_url += url_obj.path;
        }

        var i = 0;

        if (url_obj.params) {

            //将排斥参数打散成数组
            var againstParams_array = againstParams.split(',');

            $.each(url_obj.params, function(k, v) {
                if( E.inArray( k , againstParams_array ) ){
                    return true;
                }
                if ( i == 0 ) {
                    new_url += '?' + k + '=' + v;
                } else {
                    new_url += '&' + k + '=' + v;
                }
                i++;
            });
        }

        if( addParams ){

            $.each( addParams , function(k1,v1){

                if ( i == 0 ) {
                    new_url += '?' + k1 + '=' + v1;
                } else {
                    new_url += '&' + k1 + '=' + v1;
                }

                i++;

            } );

        }

        return new_url;

    },


    /**
     * 获得当前日期
     * @returns {string}
     */
    date: function() {
        var dt = new Date(),
            y = dt.getFullYear(),
            m = parseInt(dt.getMonth()) + 1 > 9 ? parseInt(dt.getMonth()) + 1 : '0' + (parseInt(dt.getMonth()) + 1),
            d = dt.getDate() > 9 ? dt.getDate() : '0' + dt.getDate();
        return y + '-' + m + '-' + d;
    },

    /**
     * 获得当前日期+时间
     * @returns {string}
     */
    datetime: function() {
        var dt = new Date(),
            y = dt.getFullYear(),
            m = parseInt(dt.getMonth()) + 1 > 9 ? parseInt(dt.getMonth()) + 1 : '0' + (parseInt(dt.getMonth()) + 1),
            d = dt.getDate() > 9 ? dt.getDate() : '0' + dt.getDate(),
            h = dt.getHours() > 9 ? dt.getHours() : '0' + dt.getHours(),
            i = dt.getMinutes() > 9 ? dt.getMinutes() : '0' + dt.getMinutes(),
            s = dt.getSeconds() > 9 ? dt.getSeconds() : '0' + dt.getSeconds();

        return y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
    },

    /**
     * 获取当前时间
     * @returns {string}
     */
    time: function() {
        var dt = new Date(),
            h = dt.getHours() > 9 ? dt.getHours() : '0' + dt.getHours(),
            i = dt.getMinutes() > 9 ? dt.getMinutes() : '0' + dt.getMinutes(),
            s = dt.getSeconds() > 9 ? dt.getSeconds() : '0' + dt.getSeconds();

        return h + ':' + i + ':' + s;
    },

    /**
     * 复制对象
     * @param obj
     * @returns {*}
     */
    clone: function( obj ) {

        var buf;
        if (obj instanceof Array) {
            buf = [];
            var i = obj.length;
            while (i--) {
                buf[i] = E.clone(obj[i]);
            }
            return buf;
        } else if (obj instanceof Object) {
            buf = {};
            for ( var k in obj ) {
                buf[k] = E.clone(obj[k]);
            }
            return buf;
        } else {
            return obj;
        }
    },
    // 倒计时
    countDown: function (et, g, f) {
        var timer = window.setInterval(function() {
            var nt = new Date().getTime();
            var l = et - nt;
            if (l <= 0) {
                f();
                clearInterval(timer);
                return false;
            }
            var d = Math.floor(l / 86400000);
            var h = Math.floor((l - d * 86400000) / 3600000);
            var m = Math.floor((l - d * 86400000 - h * 3600000) / 60000);
            var s = Math.ceil((l - d * 86400000 - h * 3600000 - m * 60000) / 1000);

            if (h < 10) {
                h = '0' + h;
            }
            if (m < 10) {
                m = '0' + m;
            }
            if (s < 10) {
                s = '0' + s;
            }
            g(d, h, m, s);
        }, 1000);
    }
};
